package com.jt.service;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


import java.util.*;

@Service
public class ItemCatServiceImpl implements ItemCatService{

    @Autowired
    private ItemCatMapper itemCatMapper;


    /**
     * 实现商品分类新增
     * 有些数据应该提前填充 status/创建时间/修改时间
     * @param itemCat
     */
    @Override
    @Transactional     //事务注解
    public void saveItemCat(ItemCat itemCat) {

        itemCat.setStatus(true);
                  //自动填充
//                .setCreated(new Date())
//                .setUpdated(itemCat.getCreated());
        itemCatMapper.insert(itemCat);

    }

    /**
     * 商品分类删除操作
     * 删除思路：
     *       1.判断是否为3级  如果是直接删除
     *       2。判断是否为2级  如果是2级，先删除三级，再删除2级
     *       3.如果是1级，先查询2级，再删除3级/2级/1级
     * @param itemCat
     */
    @Override
    @Transactional
    public void deleteItemCat(ItemCat itemCat) {
       if(itemCat.getLevel() == 3){
           itemCatMapper.deleteById(itemCat.getId());
           return;
       }
       if(itemCat.getLevel() == 2){
           int twoId = itemCat.getId();
           QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
           queryWrapper.eq("parent_id", twoId);
           //找到三级数据直接删除
           itemCatMapper.delete(queryWrapper);
           itemCatMapper.deleteById(twoId);
           return;
       }
       if(itemCat.getLevel() == 1){
           int oneId = itemCat.getId();
           QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
           queryWrapper.eq("parent_id", oneId);
           List twoIdList = itemCatMapper.selectObjs(queryWrapper);
           if (twoIdList.size() == 0){//有可能为空的集合，绝对不可能为null
               //如果没有二级的数据，则直接删除一级的数据
               itemCatMapper.deleteById(oneId);
           }else {
            //表示有二级，可以删除三级
            //Sql:
            queryWrapper.clear();
            queryWrapper.in("parent_id", twoIdList)
            .or()
            .in("id", twoIdList)
            .or()
            .eq("id", oneId);
            itemCatMapper.delete(queryWrapper);
           }
       }

    }

    /**
     * 业务需求： 修改商品分类状态
     * Sql:update item_cat set status = #{status},updated = #{updated} where id = #{id}
     * @param itemCat
     */
    @Override
    @Transactional
    public void status(ItemCat itemCat) {
        itemCat.setStatus(true);
        QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id", itemCat.getId());
        itemCatMapper.update(itemCat,queryWrapper);
    }

    /** 业务需求：修改商品分类
     * xiu
     * @param itemCat
     */
    @Override
    @Transactional
    public void updateItemCat(ItemCat itemCat) {
        QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id", itemCat.getId());
        itemCatMapper.update(itemCat, queryWrapper);

    }



    public Map<Integer,List<ItemCat>> getMap(){
        //1.查询所有的数据库信息
        //降低查询的次数
        Map<Integer, List<ItemCat>> map = new HashMap<>();
        List<ItemCat> list = itemCatMapper.selectList(null);
        for (ItemCat itemCat:list){ int key = itemCat.getParentId();
            if (map.containsKey(key)){
                //有值: 获取List集合,将自己追加到其中
                map.get(key).add(itemCat);

            }else {
                //没值: 添加数据.将自己作为第一个元素填充
                List<ItemCat> childrenList = new ArrayList<>();
                childrenList.add(itemCat);
                map.put(key, childrenList);

            }
        }
        return map;
    }


    //level  获取菜单1/2/3
    @Override
    public List<ItemCat> findItemCatList(Integer level) {
        //获取数据信息
        long startTime = System.currentTimeMillis();
        Map<Integer, List<ItemCat>> map = getMap();
        if (level == 1) {
            //只获取一级菜单数据
            return map.get(0);
        }

        if (level == 2) {
            //获取1~2级数据
            return getTwoList(map);

        }

        List<ItemCat> list = getThreeList(map);
        long endTime = System.currentTimeMillis();
        System.out.println("耗时："+(endTime-startTime)+"毫秒");
        //获取三级数据1-2-3
        return list;
    }

    private List<ItemCat> getThreeList(Map<Integer, List<ItemCat>> map) {
        //获取一级二级数据
        List<ItemCat> oneList = getTwoList(map);
        for (ItemCat oneItemCat : oneList){
            List<ItemCat> twoList = oneItemCat.getChildren();
            if (twoList == null){
                //说明该一级下没有二级数据。所以跳过本次循环,进入下一级
                continue;
            }
            for (ItemCat TwoItemCat : twoList){
                //查询三级数据使用二级id
                int key = TwoItemCat.getId();
                List<ItemCat> ThreeList = map.get(key);
                TwoItemCat.setChildren(ThreeList);
            }
        }
        return oneList;
    }

    //获取1-2级菜单
        private List<ItemCat> getTwoList (Map < Integer, List < ItemCat >> map){
            //获取一级数据
            List<ItemCat> oneList = map.get(0);
            for (ItemCat oneItemCat : oneList) {
                //根据一级ID查询二级集合
                int key = oneItemCat.getId();
                List<ItemCat> twoList = map.get(key);
                //将二级数据封装到一级中
                oneItemCat.setChildren(twoList);
            }
            return oneList;
        }
    }


        /**
         * 只查询一级菜单   parent_id = 0 或者  level = 1
         * 时效长，不采用
         */
//        long startTime = System.currentTimeMillis();
//        QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("parent_id", 0);
//        List<ItemCat> oneList = itemCatMapper.selectList(queryWrapper);
//        for (ItemCat oneItemCat: oneList){
//            //获取一级对象id
//            int oneId = oneItemCat.getId();
//            //清空多余的条件
//            queryWrapper.clear();
//            //查询二级数据
//            queryWrapper.eq("parent_id", oneId);
//            List<ItemCat> twoList = itemCatMapper.selectList(queryWrapper);
//            oneItemCat.setChildren(twoList);
//            for (ItemCat twoItemCat: twoList){
//                int twoId = twoItemCat.getId();
//                queryWrapper.clear();
//                queryWrapper.eq("parent_id", twoId);
//                List<ItemCat> threeList = itemCatMapper.selectList(queryWrapper);
//                twoItemCat.setChildren(threeList);
//            }
//        }
//        //列表展现耗时
//        long endTime = System.currentTimeMillis();
//        System.out.println("耗时："+(endTime-startTime)+"毫秒");
//
//        return oneList;


